// 基于 axios 封装的请求模块
import axios from 'axios'
import store from '@/store/'
// import router from '@/router/'
import { refreshTokenAPI } from '@/api/user.js'
import router from '../router'
// 新建一个新的axios实例
const request = axios.create({
  baseURL: 'http://toutiao.itheima.net' // 基地址
})

// 导出自定义函数, 参数对象解构赋值，箭头函数
export default ({ url, method = 'GET', params, data, headers, isAuth = true }) => {
  return request({
    url: url,
    method: method,
    params: params,
    data: data,
    headers: headers,
    isAuth: isAuth
  })

  // 以后换库, 只需要改这里, 逻辑页面不用动, 保证代码的复用性和独立性(高内聚低耦合)
  //   return $.ajax({
  //     url: url,
  //     type: method,
  //     data: data,
  //     header: headers
  //   })
}

// 响应拦截器
request.interceptors.response.use(resp => { // 成功  http 状态码 以 2/3 开头
  // 每次服务器数据达到浏览器之前，必须经过这里
  // 公共处理
  // return resp.data
  return resp
}, async err => { // 失败/错误  http 状态码 以 4/5 开头
  // err是错误对象 它的response字段记录了错误信息  status  statusText
  if (err.response.status === 401) { // 身份过期/token无效
    // // 1. 清空token （vuex + 本地）
    // console.log(55)
    // store.commit('setToken', '')
    // store.commit('setRefreshToken', '')
    // localStorage.removeItem('token')
    // localStorage.removeItem('refresh_token')
    // // 2. 跳转到登录页面登录
    // router.push({
    //   path: '/login'
    // })
    // 续签方式2: refresh_token刷新一个新的token回来
    const res = await refreshTokenAPI()
    store.commit('setToken', res.data.data.token)
    localStorage.setItem('token', res.data.data.token)
    // 本来这次请求还未成功呢, 拿到新的token后, 把未成功的请求再发一次
    err.config.headers.Authorization = `Bearer ${res.data.data.token}` // 刷新正确的token携带
    return request(err.config) // return到上一次发起请求的位置
    // console.dir(err)
  } else if (err.response.status === 500) {
    store.commit('setToken', '')
    store.commit('setRefreshToken', '')
    store.commit('setUser', '')
    localStorage.clear()
    // this是vue实例, 实例上才有$route, 而这是js文件, 不能写this.$route
    router.push(`/login?path=${router.currentRoute.path}`)
  }
  console.log(err)
  return Promise.reject(err)
})

// 添加请求拦截器
request.interceptors.request.use(config => {
  // 在发送请求之前做些什么, 如果vuex里有token携带在请求头中
  if (store.state.token.length > 0 && config.headers.Authorization === undefined && config.isAuth === true) {
    // 发起请求之前, 把token携带在请求头上(表明自己身份)
    config.headers.Authorization = 'Bearer ' + store.state.token
  }
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})
